package com.hhwy.framework.persistent;

import java.util.List;
import java.util.Map;

import com.hhwy.framework.persistent.entity.Domain;
import com.hhwy.framework.persistent.query.IWhereClause;
/**
 * <b>类 名 称：</b>DAO 通用数据访问接口，提供基于JPA和Mybatis的数据访问支持<br/>
 * <b>类 描 述：</b><br/>
 * <b>创 建 人：</b>lihuiming<br/>
 * <b>修 改 人：</b>lihuiming<br/>
 * <b>修改时间：</b>2014年8月16日 下午5:10:06<br/>
 * <b>修改备注：</b><br/>
 * @version 1.0.0<br/>
 */
public interface DAO<T> {  
	
	/**
	 * findBySql(使用原生SQL查询,基于Mybatis)<br/>
	 * @param sql
	 * @param params
	 * @return 
	 * T
	 * @exception 
	 * @since  1.0.0
	 */
	public List<T> getBySql(String sqlKey, Map<String, Object> params);
	public List<T> getBySql(String sqlKey, Object parameter);
	/**
	 * getOneBySQL(使用原生SQL查询单个结果,基于Mybatis)<br/>
	 * @param sqlKey
	 * @param params
	 * @return 
	 * T
	 * @exception 
	 * @since  1.0.0
	 */
	public T getOneBySQL(String sqlKey, Map<String, Object> params);
	public T getOneBySQL(String sqlKey, Object parameter);
	/**
	 * saveBySql(使用原生SQL保存数据，基于Mybatis)<br/>
	 * @param sqlKey
	 * @param parameter
	 * @return 
	 * int
	 * @exception 
	 * @since  1.0.0
	 */
	public int saveBySql(String sqlKey, Object parameter);
	/**
	 * updateBySql(使用原生SQL更新数据，基于MyBatis)<br/>
	 * @param sqlKey
	 * @param parameter
	 * @return 
	 * int
	 * @exception 
	 * @since  1.0.0
	 */
	public int updateBySql(String sqlKey, Object parameter);
	/**
	 * deleteBySql(使用原生SQL删除数据， 基于MyBatis)<br/>
	 * @param sqlKey
	 * @param parameter
	 * @return 
	 * int
	 * @exception 
	 * @since  1.0.0
	 */
	public int deleteBySql(String sqlKey, Object parameter);
	/**
	 * executeSql(执行原生SQL， 基于MyBatis)。
	 * @param sqlKey
	 * @param parameter
	 * @return 
	 * int
	 * @exception 
	 * @since  1.0.0
	 */
	public Object executeSql(String sqlKey, Object parameter);
	
	
	/**
	 * queryPage 基于mybatis的分页查询<br/>
	 * @param sqlKey
	 * @param parameter
	 * @return 
	 * List<E>
	 * @exception 
	 * @since  1.0.0
	 */
	public QueryResult query(String sqlKey, Map parameter);

	/**
	 * 
	 * find 使用JPQL进行查询，返回结果为List,如果能够找到匹配的VO类，则返回List<VO><br/>
	 * @param jpql
	 * @param params
	 * @return 
	 * T
	 * @exception 
	 * @since  1.0.0
	 */
	@SuppressWarnings("hiding")
	public <T> T find(String jpql, Object[] params);
	
	@SuppressWarnings("hiding")
	public <T> T findOne(String jpql, Object[] params);
	
	/**
	 * 
	 * find  使用JPQL进行查询，返回结果为List,类型为指定的clazzVO，返回List<VO><br/>
	 * @param entityClass
	 * @param clazzVO
	 * @param where
	 * @return 
	 * T
	 * @exception 
	 * @since  1.0.0
	 */
	@SuppressWarnings({ "rawtypes", "hiding" })
	public <T> T find(Class<? extends Domain> entityClass, Class clazzVO, IWhereClause where);
	/**
	 * 
	 * findEntity 只查询实体，不进行VO转换<br/>
	 * @param jpql
	 * @param params
	 * @return 
	 * T
	 * @exception 
	 * @since  1.0.0
	 */
	@SuppressWarnings("hiding")
	public <T> T findEntity(String jpql, Object[] params);
	/**
	 * 
	 * findEntity 只查询实体，不进行VO转换<br/>
	 * @param jpql
	 * @param params
	 * @return 
	 * T
	 * @exception 
	 * @since  1.0.0
	 */
	@SuppressWarnings("hiding")
	public <T> T findEntity(Class<? extends Domain> entityClass, IWhereClause where);
	
	/**
	 * save(保存实体对象,如果不存在则insert；如果存在则update)<br/>
	 * @param entity 
	 * void
	 * @exception 
	 * @since  1.0.0
	 */
	public void save(Object entity);
	/**
	 * save(插入实体对象，insert)<br/>
	 * @param entity 
	 * void
	 * @exception 
	 * @since  1.0.0
	 */
	public void insert(Object entity);
	/**
	 * saveExcludeNull(保存实体对象，排除为空的属性)<br/>
	 * @param entity 
	 * void
	 * @exception 
	 * @since  1.0.0
	 */
	public void saveExcludeNull(Object entity);
	/**
	 * saveList(批量保存，不存在时insert；存在时update)<br/>
	 * @param list 
	 * void
	 * @exception 
	 * @since  1.0.0
	 */
	public void saveList(List<?> list);
	/**
	 * saveList(批量插入)<br/>
	 * @param list 
	 * void
	 * @exception 
	 * @since  1.0.0
	 */
	public void insertList(List<?> list);
	/**
	 * delete(删除一个实体对象)<br/>
	 * @param entity
	 * @return 
	 * int
	 * @exception 
	 * @since  1.0.0
	 */
	public int delete(Object entity);
	/**
	 * deleteList(删除一组实体对象)<br/>
	 * @param list
	 * @return 
	 * int
	 * @exception 
	 * @since  1.0.0
	 */
	public int deleteList(List<?> list);
	/**
	 * executeJPQL(执行JPQL进行批量操作，如批量更新或删除)<br/>
	 * 此方法在某些情况下会产生事务异常，已废弃！！！<br/>
	 * @param jpql
	 * @param params
	 * @return 
	 * int
	 * @exception 
	 * @since  1.0.0
	 */
	@Deprecated()
	public int executeJPQL(String jpql, Object[] params);
	/**
	 * getPage(查询分页数据)<br/>
	 * @param entityClass
	 * @param where
	 * @return 
	 * QueryResult<T>
	 * @exception 
	 * @since  1.0.0
	 */
	@SuppressWarnings("hiding")
	public <T> QueryResult<T> getPage(Class<T> entityClass, IWhereClause where) ;
	
	/**
	 * findById(按指定id查询一个实体对象)<br/>
	 * @param id
	 * @param clazz
	 * @return 
	 * T
	 * @exception 
	 * @since  1.0.0
	 */
	@SuppressWarnings("hiding")
	public <T> T findById(String id, Class<T> clazz);
	/**
	 * findVOById(查询一个指定id的vo对象)<br/>
	 * @param id
	 * @param clazz
	 * @return
	 * @throws Exception 
	 * T
	 * @exception 
	 * @since  1.0.0
	 */
	@SuppressWarnings("hiding")
	public <T> T findVOById(String id, Class<T> clazz) throws Exception;
	/**
	 * delete(按指定的id数组，删除实体对象)<br/>
	 * @param ids
	 * @param clazz 
	 * void
	 * @exception 
	 * @since  1.0.0
	 */
	public void delete(String[] ids, Class<?> clazz);
	/**
	 * update(更新一个实体)<br/>
	 * @param entity 
	 * void
	 * @exception 
	 * @since  1.0.0
	 */
	public void update(Object entity);
	
	public void updateExcludeNull(Object entity);

}